import { parseAge } from '@/utils/datetime'

/** 总的校验方法
 * @param {(String)} idCard 要校验的身份证号码
 * @returns {Boolean}
 */
export function validateIdCard(idCard) {
  // 是否为空
  if (idCard === null || idCard === '') return false
  var vcity = {
    11: '北京',
    12: '天津',
    13: '河北',
    14: '山西',
    15: '内蒙古',
    21: '辽宁',
    22: '吉林',
    23: '黑龙江',
    31: '上海',
    32: '江苏',
    33: '浙江',
    34: '安徽',
    35: '福建',
    36: '江西',
    37: '山东',
    41: '河南',
    42: '湖北',
    43: '湖南',
    44: '广东',
    45: '广西',
    46: '海南',
    50: '重庆',
    51: '四川',
    52: '贵州',
    53: '云南',
    54: '西藏',
    61: '陕西',
    62: '甘肃',
    63: '青海',
    64: '宁夏',
    65: '新疆',
    71: '台湾',
    81: '香港',
    82: '澳门',
    91: '国外',
  }
  // 校验长度，类型
  if (checkLength(idCard) === false) {
    return false
  }
  // 检查省份
  if (checkProvince(idCard, vcity) === false) {
    return false
  }
  // 校验生日
  if (checkBirthday(idCard) === false) {
    return false
  }
  // 检验位的检测
  if (checkParity(idCard) === false) {
    return false
  }
  return true
}

// 从身份证得到出生年月
export function getBirthdayFromIdCard(idCard) {
  if (idCard === null || idCard === '') return ''
  if (!validateIdCard(idCard)) return ''
  var birthday = ''
  if (idCard.length === 15) {
    birthday = '19' + idCard.slice(6, 12)
  } else if (idCard.length === 18) {
    birthday = idCard.slice(6, 14)
  }
  // 通过正则表达式来指定输出格式为:1990-01-01
  return birthday.replace(/(.{4})(.{2})/, '$1-$2-')
}

// 从身份证得到年龄
export function getAgeFromIdCard(idCard) {
  if (idCard === null || idCard === '') return ''
  if (!validateIdCard(idCard)) return ''
  var birthday = getBirthdayFromIdCard(idCard)
  return parseAge(birthday)
}

// 从身份证得到性别
export function getSexFromIdCard(idCard) {
  if (idCard === null || idCard === '') return ''
  if (!validateIdCard(idCard)) return ''
  var sexStr = ''
  if (parseInt(idCard.slice(-2, -1)) % 2 === 1) {
    sexStr = '男'
  } else {
    sexStr = '女'
  }
  return sexStr
}

// 检查号码是否符合规范，包括长度，类型
function checkLength(idCard) {
  // 身份证号码为15位或者18位，15位时全为数字
  // 18位前17位为数字，最后一位是校验位，可能为数字或字符X
  var reg = /(^\d{15}$)|(^\d{17}(\d|X|x)$)/
  if (reg.test(idCard) === false) {
    return false
  }
  return true
}

// 取身份证前两位，校验省份
function checkProvince(idCard, vcity) {
  var province = idCard.substr(0, 2)
  if (vcity[province] === undefined) {
    return false
  }
  return true
}

// 检查生日是否正确
function checkBirthday(idCard) {
  var len = idCard.length
  var arr_data, year, month, day, birthday
  // 身份证15位时，次序为省（3位）市（3位）年（2位）月（2位）日（2位）校验位（3位），皆为数字
  if (len === 15) {
    var reg15 = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/
    arr_data = idCard.match(reg15)
    year = arr_data[2]
    month = arr_data[3]
    day = arr_data[4]
    birthday = new Date('19' + year + '/' + month + '/' + day)
    return verifyBirthday('19' + year, month, day, birthday)
  }
  // 身份证18位时，次序为省（3位）市（3位）年（4位）月（2位）日（2位）校验位（4位），校验位末尾可能为X
  if (len === 18) {
    var reg18 = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X|x)$/
    arr_data = idCard.match(reg18)
    year = arr_data[2]
    month = arr_data[3]
    day = arr_data[4]
    birthday = new Date(year + '/' + month + '/' + day)
    return verifyBirthday(year, month, day, birthday)
  }
  return false
}

// 校验生日
function verifyBirthday(year, month, day, birthday) {
  // 给定的年月日和生日的年月日是否相等，以此判断年月日是否合理
  if (
    birthday.getFullYear() + '' === year &&
    birthday.getMonth() + 1 + '' === month &&
    birthday.getDate() + '' === day
  ) {
    // 判断年份的范围（0岁到150岁之间)
    var time = new Date().getFullYear() - year
    if (time >= 0 && time <= 150) {
      return true
    }
    return false
  }
  return false
}

// 校验位的检测
function checkParity(idCard) {
  // 15位转18位
  idCard = change15To18(idCard)
  if (idCard.length === 18) {
    var arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    var arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
    var cardTemp = 0
    var i, valnum
    for (i = 0; i < 17; i++) {
      cardTemp += idCard.substr(i, 1) * arrInt[i]
    }
    valnum = arrCh[cardTemp % 11]
    if (valnum === idCard.substr(17, 1).toLocaleUpperCase()) {
      return true
    }
    return false
  }
  return false
}

// 15位转18位身份证号
function change15To18(idCard) {
  if (idCard.length === 15) {
    var arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
    var arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
    var cardTemp = 0
    var i
    idCard = idCard.substr(0, 6) + '19' + idCard.substr(6, idCard.length - 6)
    for (i = 0; i < 17; i++) {
      cardTemp += idCard.substr(i, 1) * arrInt[i]
    }
    idCard += arrCh[cardTemp % 11]
    return idCard
  }
  return idCard
}
